package com.webflux.sample.webfluxmain;

import java.util.ArrayList;
import java.util.Random;
import reactor.core.publisher.Flux;

public class _3flux_generate {

  public static void main(String[] args) {
    // 当序列的生成需要复杂的逻辑时，则应该使用generate()或create()方法。
    // generate()方法通过同步和逐一的方式来产生Flux序列。
    // 序列的产生是通过调用所提供的的SynchronousSink对象的next()，complete()和error(Throwable)方法来完成的。
    //逐一生成的含义是在具体的生成逻辑中，next()方法只能最多被调用一次。
    //在某些情况下，序列的生成可能是有状态的，需要用到某些状态对象，此时可以使用

    System.out.println("generate");
    Flux.generate(sink -> {
      sink.next("Hello");
      sink.complete();
    }).subscribe(System.out::println);


    final Random random = new Random();
    Flux.generate(ArrayList::new, (list, sink) -> {
      int value = random.nextInt(100);
      list.add(value);
      sink.next(value);
      if( list.size() ==10 )
        sink.complete();
      return list;
    }).subscribe(System.out::println);

    System.out.println("create");
    Flux.create(sink -> {
      for(int i = 0; i < 10; i ++)
        sink.next(i);
      sink.complete();
    }).subscribe(System.out::println);
  }

}
